<?php

namespace App\Services\Template;

use App\Models\Template;
use File;
use Illuminate\Support\Collection;
use Str;

/**
 * 模板服务,返回所有模板名称
 * @package App\Services
 */
class TemplateService
{
    protected $datas;

    public function __construct()
    {
        $this->datas = $this->readAll();
    }

    /**
     * 1、初始化模板系统
     * 2、读取模板名称
     * 3、将模板文件内容存入到数据表
     *
     */
    public function init()
    {
        //判断如果数据库中已经有数据了，就不在重复移动了
        if (collect(Template::all())->count() == 0) {
            $templates = File::directories(base_path('templates'));

            $templateNames = collect($templates)->map(function ($template) {
                return $this->getName($template);
            });
            foreach ($this->datas as $key => $data) {
                $this->preview($templateNames[$key]);//移动图片文件
                $data += ['preview' => url("templates/" . $templateNames[$key] . "/preview.png")];//合并图片路径
                Template::Create($data);//添加进数据库
            }
        }
    }


    /**
     * 读取所有模板配置文件
     * @return Collection
     */
    public function readAll()
    {
        $templates = File::directories(base_path('templates'));
        return collect($templates)->map(function ($template) {
            return include $template . "/config.php";
        });
    }

    /**
     * 创建路径
     * 移动根下templates模板模板预览图片到public/templates/模板/
     */
    protected function preview($name)
    {
        $dir = public_path("templates/{$name}");
        $preview = "{$dir}/preview.png";
        if (!is_dir($dir)) {
            File::makeDirectory(public_path("templates/{$name}"), 0755, true);
        }
        if (!is_file($preview)) {
            File::copy(base_path("templates/{$name}/preview.png"), $preview);
        }
        return $preview;
    }


    /**
     * 按照完整路径获取到文件名
     * @param $template
     * @return mixed
     */
    public function getName($template)
    {
        //default or custom
        return Str::of($template)->basename();
    }

    /**
     * 获得正在使用的模板名称
     */
    public function getActiveTemplate()
    {
        $template = Template::where('installed', true)->first();
        return $template->name;
    }
}
